home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 031-040 / amok39 / datatoobj / datatoobject.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-04  |  10.7 KB  |  377 lines

  1. /* ------------------------------------------------------------------------
  2.   :Program.       DataToObject
  3.   :Contents.      Programm to convert Data- into Object-Files
  4.   :Author.        Werner Gunther
  5.   :Address.       g35@DHDURZ1.BITNET
  6.   :Copyright.     Public Domain
  7.   :Language.      C
  8.   :Translator.    Aztec-C 3.4b
  9. ------------------------------------------------------------------------ */
  10.  
  11. #include <libraries/dos.h>
  12. #include <intuition/intuition.h>
  13. #include <exec/memory.h>
  14.  
  15. #define loadname names[0]
  16. #define savename names[1]
  17. #define variablename names[2]
  18. #define variablelenname names[3]
  19. #define BLKSTART (('B'<<24)+('L'<<16)+('O'<<8)+'K')
  20.  
  21. /* ------------- Requester Data -------------------- */
  22.  
  23. struct IntuitionBase     *IntuitionBase=NULL;
  24. struct GfxBase           *GfxBase=NULL;
  25. struct RastPort          *rp;
  26. struct Window            *wn=NULL;
  27. struct IntuiMessage      *msg;
  28. struct TextAttr ta={"topaz.font",8,FS_NORMAL,NULL};
  29. char names[4][33]={"","","",""},undo[33];
  30. ULONG class;
  31.  
  32. struct IntuiText booltext[4]=
  33. {
  34.    {1,0,JAM1,8,1,&ta,"Chip"  ,NULL},
  35.    {1,0,JAM1,8,1,&ta,"Fast"  ,NULL},
  36.    {1,0,JAM1,8,1,&ta,"Save"  ,NULL},
  37.    {1,0,JAM1,0,1,&ta,"Cancel",NULL}
  38. };
  39. struct IntuiText stringtext[3]=
  40. {
  41.    {1,0,JAM1,16,-11,&ta,"Data File"    ,NULL},
  42.    {1,0,JAM1, 8,-11,&ta,"Object File"  ,NULL},
  43.    {1,0,JAM1, 0,-11,&ta,"Variable Name",NULL}
  44. };
  45. struct IntuiText errortext[2]=
  46. {
  47.    {1,0,JAM1,0,0,&ta,"Error,check input",NULL},
  48.    {1,0,JAM1,0,0,&ta,"                 ",NULL},
  49. };
  50. struct StringInfo loadstr= {loadname,    undo,0,32,0,0,0,0,0,0,0};
  51. struct StringInfo savestr= {savename,    undo,0,32,0,0,0,0,0,0,0};
  52. struct StringInfo varstr = {variablename,undo,0,32,0,0,0,0,0,0,0};
  53.  
  54. USHORT booledges[]=
  55.    {-1,-1, 49,-1, 49,9,-1,9,-1,-1};
  56. USHORT stringedges[]=
  57.    {-2,-2,105,-2,105,8,-2,8,-2,-2};
  58.  
  59. struct Border boolborder  ={0,0,1,0,JAM1,5,booledges  ,NULL};
  60. struct Border stringborder={0,0,1,0,JAM1,5,stringedges,NULL};
  61.  
  62. struct Gadget chipgad=
  63.    {NULL,10,15,48,9,GADGHCOMP,RELVERIFY|TOGGLESELECT,
  64.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[0],NULL,NULL,0,NULL};
  65. struct Gadget fastgad=
  66.    {&chipgad,10,30,48,9,GADGHCOMP,RELVERIFY|TOGGLESELECT,
  67.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[1],NULL,NULL,1,NULL};
  68. struct Gadget savegad=
  69.    {&fastgad,10,60,48,9,GADGHCOMP|GADGDISABLED,RELVERIFY,
  70.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[2],NULL,NULL,2,NULL};
  71. struct Gadget cancelgad=
  72.    {&savegad,10,75,48,9,GADGHCOMP,RELVERIFY,
  73.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[3],NULL,NULL,3,NULL};
  74.  
  75. struct Gadget loadgad=
  76.    {&cancelgad,76,25,104,10,GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET,
  77.     (APTR)&stringborder,NULL,&stringtext[0],NULL,(APTR)&loadstr,4,NULL};
  78. struct Gadget objectgad=
  79.    {&loadgad,  76,50,104,10,GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET,
  80.     (APTR)&stringborder,NULL,&stringtext[1],NULL,(APTR)&savestr,5,NULL};
  81. struct Gadget variablegad=
  82.    {&objectgad,76,75,104,10,GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET,
  83.     (APTR)&stringborder,NULL,&stringtext[2],NULL,(APTR)&varstr,6,NULL};
  84.  
  85. struct NewWindow nw=
  86. {
  87.  60,40, 200,100, 0,1,
  88.  GADGETUP|CLOSEWINDOW,
  89.  WINDOWDEPTH|WINDOWCLOSE|WINDOWDRAG|SIMPLE_REFRESH|ACTIVATE|RMBTRAP,
  90.  &variablegad,
  91.  NULL,
  92.  "Data to Object",
  93.  NULL, NULL, NULL,NULL,NULL,NULL,
  94.  WBENCHSCREEN,
  95. };
  96.  
  97. /* ------------- Program Data -------------------- */
  98.  
  99. BOOL fast=FALSE,chip=FALSE;
  100. BPTR flock,in,out;
  101. short i;
  102.  
  103. struct DataToWrite
  104. {
  105.  char  *start;        /* pointer to the data */
  106.  ULONG length;        /* length of the data block to write */
  107. };
  108.  
  109. struct ObjectFile
  110. {
  111.  ULONG Hunk_Unit;     /* type of file, this a object file (0x3e7) */
  112.  ULONG Namelen;       /* length of the name of this hunk (0 = no name) */
  113.  ULONG Hunk_Data;     /* start of a data hunk (0x3ea) */
  114.  ULONG HunkLen;
  115.  /* length in long words */
  116.  
  117.  ULONG datastart1;    /* 'BLOK' */
  118.  struct DataToWrite data;  /* data info */
  119.  
  120.  ULONG RealLength;    /* used to store the real length of the data-file */
  121.  ULONG Hunk_Ext;      /* start of external definitions (0x3ef) */
  122.  ULONG Ext_Def1;      /* type of definition (01 = external definition) */
  123.  
  124.  ULONG datastart2;    /* 'BLOK' */
  125.  struct DataToWrite varname;  /* name of the data hunk */
  126.  
  127.  ULONG Value1;        /* offset in data hunk */
  128.  ULONG Ext_Def2;      /* same for the length of the data hunk */
  129.  
  130.  ULONG datastart3;
  131.  struct DataToWrite varlenname;
  132.  
  133.  ULONG Value2;
  134.  ULONG Hunk_Ext_End;  /* end of external definitions = null */
  135.  ULONG Hunk_End;      /* =0x3f2 */
  136. }object=
  137. {
  138.  0x3e7,
  139.  NULL,
  140.  0x3ea,
  141.  NULL,
  142.  BLKSTART,
  143.  {NULL,NULL},
  144.  NULL,
  145.  0x3ef,
  146.  0x01000000,
  147.  BLKSTART,
  148.  {variablename,NULL},
  149.  NULL,
  150.  0x01000000,
  151.  BLKSTART,
  152.  {variablelenname,NULL},
  153.  NULL,
  154.  NULL,
  155.  0x3f2
  156. };
  157.  
  158. void main(),get_parms(),refreshwindow(),quit(),set_defaults();
  159. BOOL writeobj();
  160.  
  161. /*------------------------ Main program ---------------------------*/
  162. void main(argc,argv)
  163. short argc;
  164. char *argv[];
  165. {
  166.  for(i=1;i<4 && i<argc && *argv[i]!='-';i++) /* get names for files and */
  167.   strcpy(names[i-1],argv[i]);                /* variables */
  168.  
  169.  if(argc && *argv[i]=='-')                   /* check for options */
  170.   if(!stricmp(argv[i],"-f"))                 /* -f = fast-mem */
  171.   {
  172.    fastgad.Flags|=SELECTED;
  173.    fast=TRUE;
  174.   }
  175.   else if(!stricmp(argv[i],"-c"))            /* -c = chip-mem */
  176.   {
  177.    chipgad.Flags|=SELECTED;
  178.    chip=TRUE;
  179.   }
  180.  if(!(IntuitionBase=(struct IntuitionBase*)
  181.    OpenLibrary("intuition.library",0L))) exit(20);
  182.  if(!(GfxBase=(struct GfxBase*)
  183.    OpenLibrary("graphics.library",0L))) quit(20);
  184.  
  185.  set_defaults();
  186.  
  187.  if(i!=4) get_parms(NULL); /* if parameters are missing,create a requester */
  188.  
  189.  while(!writeobj())        /* pop up the requester until we did write the */
  190.   get_parms(1);            /* object file to disk */
  191.  
  192.  quit(0);
  193. }
  194.  
  195. /*------------------ Get parameters from a requester ------------------*/
  196. void get_parms(error)
  197. short error;
  198. {
  199.  if(!wn)
  200.   if(!(wn=(struct Window *) OpenWindow(&nw))) quit(20);
  201.  
  202.  /* if the requester was created by an error, display message */
  203.  if(error) PrintIText(wn->RPort,&errortext[0],28,90);
  204.  for(;;)
  205.  {
  206.   /* enable SAVE gadget if all data have been entered */
  207.   if(*loadname && *variablename && *savename &&
  208.      savegad.Flags & GADGDISABLED)
  209.   {
  210.    OnGadget(&savegad,wn,NULL);
  211.    refreshwindow();
  212.   }
  213.   else /* disable SAVE gadget */
  214.   if((!*loadname || !*variablename || !*savename) &&
  215.      !(savegad.Flags & GADGDISABLED))
  216.   {
  217.    OffGadget(&savegad,wn,NULL);
  218.    refreshwindow();
  219.   }
  220.   WaitPort(wn->UserPort);
  221.   if(msg=(struct IntuiMessage*)GetMsg(wn->UserPort))
  222.   {
  223.    class=msg->Class;
  224.    ReplyMsg(msg);
  225.    switch(class)
  226.    {
  227.     case CLOSEWINDOW:
  228.      quit(20);
  229.     case GADGETUP:
  230.      switch (((struct Gadget*)msg->IAddress)->GadgetID)
  231.      {
  232.       case 0:         /* CHIP */
  233.        chip^=TRUE;    /* toggle */
  234.        fastgad.Flags&=~SELECTED;
  235.        fast=FALSE;
  236.        refreshwindow();
  237.        break;
  238.       case 1:         /* FAST */
  239.        fast^=TRUE;    /* toggle */
  240.        chipgad.Flags&=~SELECTED;
  241.        chip=FALSE;
  242.        refreshwindow();
  243.        break;
  244.       case 2:         /* SAVE */
  245.        return;
  246.       case 3:         /* CANCEL */
  247.        quit(20);
  248.       case 4:         /* DATAFILE */
  249.        set_defaults();
  250.        refreshwindow();
  251.      }
  252.    }
  253.    if(error)
  254.    {
  255.     PrintIText(wn->RPort,&errortext[1],28,90);
  256.     error=NULL;
  257.    }
  258.   }
  259.  }
  260. }
  261.  
  262. /*------------------ Refresh Window and Gadgets ------------------*/
  263. void refreshwindow()
  264. {
  265.  SetRast(wn->RPort,0); /* clear window */
  266.  /* refresh gadgets; if anyone knows why this works better than */
  267.  /* RefreshGadget(), please tell me. */
  268.  RefreshWindowFrame(wn);
  269. }
  270.  
  271. /*---------------------- Clean up and Exit ----------------------*/
  272. void quit(errnum)
  273. short errnum;
  274. {
  275.  if (wn)            CloseWindow(wn);
  276.  if (IntuitionBase) CloseLibrary(IntuitionBase);
  277.  if (GfxBase)       CloseLibrary(GfxBase);
  278.  exit(errnum);
  279. }
  280.  
  281. /*---------------------- Write Object File ----------------------*/
  282. BOOL writeobj()
  283. {
  284.  struct FileInfoBlock *fib;
  285.  BOOL success=FALSE;
  286.  ULONG *pointer;
  287.  
  288.  strcpy(variablelenname,variablename);
  289.  strcat(variablelenname,"len");
  290.  object.varname.length    =((strlen(variablename)+3) >> 2) <<2;
  291.  object.Ext_Def1         |=((strlen(variablename)+3) >> 2);
  292.  object.varlenname.length =((strlen(variablelenname)+3) >> 2) <<2;
  293.  object.Ext_Def2         |=((strlen(variablelenname)+3) >> 2);
  294.  object.Hunk_Data |= (fast << 31) | (chip << 30);
  295.  
  296.  if(flock=Lock(loadname,ACCESS_READ)) /* data file */
  297.  {
  298.   if(fib=(struct FileInfoBlock*)
  299.      AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC))
  300.   {
  301.    if(Examine(flock,fib))             /* get info; we need the size */
  302.    {
  303.     if(fib->fib_DirEntryType<0)       /* is it a file ? */
  304.     {
  305.      object.HunkLen = ((fib->fib_Size+3) >> 2)+1;
  306.      object.data.length = ((fib->fib_Size+3) >> 2) << 2;
  307.      object.RealLength = fib->fib_Size;
  308.      object.Value2 = ((fib->fib_Size+3) >> 2) << 2;
  309.  
  310.      if(in=Open(loadname,MODE_OLDFILE)) /* yes, open */
  311.      {
  312.       if(object.data.start= (char*) AllocMem(fib->fib_Size,
  313.                                              MEMF_CLEAR|MEMF_PUBLIC))
  314.       {
  315.        if(out=Open(savename,MODE_NEWFILE)) /* open object file */
  316.        {
  317.         if(Read(in,object.data.start,fib->fib_Size)==fib->fib_Size)
  318.         {
  319.          for (pointer=(ULONG*)&object;pointer <= &object.Hunk_End;pointer++)
  320.          {
  321.           if(*pointer!=BLKSTART)
  322.           {
  323.            if(!Write(out,pointer,sizeof(ULONG))) break;
  324.           }
  325.           else if(!Write(out,*(++pointer),*(++pointer))) break;
  326.          }
  327.          Close(out);
  328.          success=TRUE;
  329.         }
  330.        }     /* if out */
  331.        FreeMem(object.data.start,fib->fib_Size);
  332.       }     /* if buffer */
  333.       Close(in);
  334.      }     /* if in */
  335.     }     /* if DirEntryType */
  336.    }     /* if Info */
  337.    FreeMem(fib,sizeof(struct FileInfoBlock));
  338.   }     /* if fib */
  339.   UnLock(flock);
  340.  }     /* if flock */
  341.  return(success);
  342. }
  343.  
  344. /*------------------------- Set default names ---------------------*/
  345. void set_defaults()                           /* fill name requesters with */
  346. {                                             /* default names */
  347.  short strstart,strend;
  348.  
  349.  if(*loadname)                                /* we need the data filename */
  350.  {
  351.   /* search and replace filename extension */
  352.   for(strend=strlen(loadname)-1;strend>-1;strend--)
  353.    if(loadname[strend]=='.') break;
  354.  
  355.   if(strend==-1) strend=strlen(loadname);
  356.  
  357.   if(!*savename)
  358.   {
  359.    strncpy(savename,loadname,strend);
  360.    savename[strend]='\0';
  361.    strcat(savename,".o");                   /* new extension is '.o' */
  362.   }
  363.   if(!*variablename)
  364.   {
  365.    /* default variablename is */
  366.    /* '_'+filename without the path and w/o the file extension */
  367.    for(strstart=strlen(loadname)-1;strstart>-1;strstart--)
  368.    if(loadname[strstart]=='/' || loadname[strstart]==':') break;
  369.    strstart++;
  370.    if(strend < strstart) strstart=0;
  371.    strcpy(variablename,"_");
  372.    strncat(variablename,&loadname[strstart],strend-strstart);
  373.    /*variablename[strend-strstart+1]='\0';*/
  374.   }
  375.  }
  376. }
  377.